#ifndef __PROD_FAC_H__
#define __PROD_FAC_H__

#include <tinyara/iotbus_pinmap.h>

#include "imxrt_adc.h"
#include "imxrt_gpio.h"
#include "imxrt_iomuxc.h"

/*
 * Board specific definition
 */
#define PORT_TYPE_GPIO_OUTPUT_HIGH (GPIO_OUTPUT | GPIO_OUTPUT_ONE | IOMUX_PULL_NONE | IOMUX_CMOS_OUTPUT | IOMUX_DRIVE_40OHM | IOMUX_SPEED_MEDIUM | IOMUX_SLEW_SLOW)
#define PORT_TYPE_GPIO_OUTPUT_LOW (GPIO_OUTPUT|GPIO_OUTPUT_ZERO|IOMUX_PULL_NONE|IOMUX_CMOS_OUTPUT|IOMUX_DRIVE_40OHM|IOMUX_SPEED_MEDIUM|IOMUX_SLEW_SLOW)
#define PORT_TYPE_GPIO_INPUT (GPIO_INPUT|IOMUX_PULL_NONE|IOMUX_CMOS_OUTPUT|IOMUX_DRIVE_40OHM|IOMUX_SPEED_MEDIUM|IOMUX_SLEW_SLOW)
#define PORT_TYPE_GPIO_INTERRUPT (GPIO_INTERRUPT|IOMUX_PULL_NONE|IOMUX_CMOS_OUTPUT|IOMUX_DRIVE_40OHM|IOMUX_SPEED_MEDIUM|IOMUX_SLEW_SLOW)
#define PORT_TYPE_ADC (GPIO_INPUT|IOMUX_PULL_KEEP|IOMUX_CMOS_OUTPUT|IOMUX_DRIVE_40OHM|IOMUX_SPEED_MEDIUM|IOMUX_SLEW_SLOW)

#define PIN_MACRO_GPIO_PAD(Port, Pin) (((Port >> GPIO_PORT_SHIFT) & 0x7) << 5) | ((Pin >> GPIO_PIN_SHIFT) & 0x1f)
#define PIN_MACRO_GPIO_PORT(pad) ((pad >> 5) & 0x07)
#define PIN_MACRO_GPIO_PIN(pad) (pad  & 0x1f)


/*
 * Product specific definition
 */
#define PORT_GPIO_TEST1 PIN_MACRO_GPIO_PAD(GPIO_PORT1, GPIO_PIN5)
#define PORT_GPIO_TEST2 PIN_MACRO_GPIO_PAD(GPIO_PORT1, GPIO_PIN9)
#define PORT_ADC_TEST1 PIN_MACRO_GPIO_PAD(ADC_ADC1, ADC_CHANNEL1)
#define PORT_ADC_TEST2 PIN_MACRO_GPIO_PAD(ADC_ADC2, ADC_CHANNEL2)

PORT_PROPERTY sPort_InitTable[] = {
	{PORT_GPIO_TEST1, PORT_TYPE_GPIO_OUTPUT_HIGH},
	{PORT_GPIO_TEST2, PORT_TYPE_GPIO_OUTPUT_LOW},
	{PORT_ADC_TEST1, PORT_TYPE_ADC},
	{PORT_ADC_TEST2, PORT_TYPE_ADC}
};

#define PORT_INIT_TABLE  (sizeof(sPort_InitTable) / sizeof(PORT_PROPERTY))

#endif // __PROD_FAC_H__
